home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / lalr.lha / lalr / src / Continue.mi < prev    next >
Text File  |  1992-08-18  |  3KB  |  127 lines

  1. (* compute continuation for error recovery *)
  2.  
  3. (* $Id: Continue.mi,v 1.3 1991/11/21 14:53:14 grosch rel $ *)
  4.  
  5. (* $Log: Continue.mi,v $
  6.  * Revision 1.3  1991/11/21  14:53:14  grosch
  7.  * new version of RCS on SPARC
  8.  *
  9.  * Revision 1.2  91/01/18  20:33:16  grosch
  10.  * fixed problem with Continuation
  11.  * 
  12.  * Revision 1.1  90/06/12  16:53:51  grosch
  13.  * renamed main program to lalr, added { } for actions, layout improvements
  14.  * 
  15.  * Revision 1.0     88/10/04  14:36:02  vielsack
  16.  * Initial revision
  17.  * 
  18.  *)
  19.  
  20. IMPLEMENTATION MODULE Continue;
  21.  
  22. FROM Automaton    IMPORT tIndex, Infinite, tProduction, tProdIndex, ProdArrayPtr,
  23.             ProdIndex, NextProdIndex, tStateKind, tStateIndex,
  24.             StateArrayPtr, StateIndex, tRep, tItemIndex, ItemArrayPtr, ItemIndex;
  25. FROM DynArray    IMPORT MakeArray;
  26. FROM Gen    IMPORT ElmtSize, Continuation, ContinuationCount, LastReadState;
  27. FROM Sets    IMPORT Select;
  28. FROM SYSTEM    IMPORT ADR, TSIZE;
  29. FROM TokenTab    IMPORT MINTerm, MAXTerm, MINNonTerm, MAXNonTerm, Vocabulary, NonTerminal;
  30.  
  31.   PROCEDURE MakeContinuation;
  32.     VAR
  33.       state, maxState : tStateIndex;
  34.       MinProdNo : tIndex;
  35.       i : tIndex;
  36.       item, BestItem : tItemIndex;
  37.       prod : tProduction;
  38.     BEGIN
  39.       ContinuationCount := LastReadState+1;
  40.       MakeArray (Continuation,ContinuationCount,ElmtSize);
  41.       Continuation^[0] := 0;
  42.  
  43.       (* Betrachte alle Zustaende *)
  44.  
  45.       maxState := StateIndex;
  46.       FOR state := 1 TO maxState DO
  47.       WITH StateArrayPtr^[state] DO
  48.     IF Kind = sRead THEN    (* Read Zustaende *)
  49.       MinProdNo := Infinite;
  50.       item := Items;
  51.       LOOP
  52.         IF item >= Items + Size THEN EXIT; END;
  53.         WITH ItemArrayPtr^[item] DO
  54.         
  55.           (* Nur Terminaluebergaenge und Reduktionen *)
  56.  
  57.           IF (ItemArrayPtr^[RepNo].Rep = TermRep) OR
  58.              (ItemArrayPtr^[RepNo].Rep = RedRep) THEN
  59.             prod := ADR (ProdArrayPtr^[Prod]);
  60.             WITH prod^ DO
  61.           IF ProdNo < MinProdNo THEN
  62.             MinProdNo := ProdNo;
  63.             BestItem := RepNo;
  64.             EXIT;
  65.           END;
  66.             END;
  67.           END;
  68.         END;
  69.         INC (item);
  70.       END;
  71.  
  72.       WITH ItemArrayPtr^[BestItem] DO
  73.         IF Rep = TermRep THEN
  74.           Continuation^[NewNumber] := Read;
  75.         ELSE    (* Waehle ein beliebiges Element aus *)
  76.           Continuation^[NewNumber] := Select (Set);
  77.         END;
  78.       END;
  79.     END;
  80.       END;
  81.       END;
  82.     END MakeContinuation;
  83.  
  84.   PROCEDURE ValueNonterms;
  85.     VAR
  86.       voc : Vocabulary;
  87.       prod : tProduction;
  88.       index,maxIndex : tProdIndex;
  89.       success : BOOLEAN;
  90.       value : tIndex;
  91.       i : tIndex;
  92.     BEGIN
  93.       FOR voc := MINNonTerm TO MAXNonTerm DO (* initialisieren *)
  94.     Value[voc] := Infinite;
  95.       END;
  96.       FOR voc := MINTerm TO MAXTerm DO
  97.     Value[voc] := 1;
  98.       END;
  99.       maxIndex := ProdIndex;
  100.  
  101.       REPEAT 
  102.     success := FALSE;
  103.     index := 0;
  104.     WHILE index < maxIndex DO
  105.       prod := ADR(ProdArrayPtr^[index]);
  106.       value := 0;
  107.       WITH prod^ DO
  108.         FOR i := 1 TO Len DO
  109.           voc := Right[i];
  110.           IF (value = Infinite) OR (Value[voc] = Infinite) THEN
  111.         value := Infinite;
  112.           ELSE
  113.         INC (value,Value[voc]);
  114.           END;
  115.         END;
  116.         IF Value [Left] > value THEN
  117.           Value [Left] := value;
  118.           success := TRUE;
  119.         END;
  120.       END;
  121.       index := NextProdIndex(index);
  122.     END;
  123.       UNTIL NOT success;
  124.     END ValueNonterms;
  125.  
  126. END Continue.
  127.